﻿#pragma once
#include "stdafx.h"

/*
四数之和  中等
给定一个包含 n 个整数的数组 nums 和一个目标值 target，判断 nums 中是否存在四个元素 a，b，c 和 d ，使得 a + b + c + d 的值与 target 相等？找出所有满足条件且不重复的四元组。

注意：

答案中不可以包含重复的四元组。

示例：

给定数组 nums = [1, 0, -1, 0, -2, 2]，和 target = 0。

满足要求的四元组集合为：
[
[-1,  0, 0, 1],
[-2, -1, 1, 2],
[-2,  0, 0, 2]
]

来源：力扣（LeetCode）
链接：https://leetcode-cn.com/problems/4sum
著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。

解题思路：这个题目跟3个数相加有一样的想法，采用双指针方法，在多下个下标，这样不断是改变

*/

vector<vector<int>> fourSum(vector<int>& nums, int target) {
	sort(nums.begin(), nums.end());
	vector<vector<int>> result;
	int size = nums.size();
	for (int a = 0; a < size - 3; ++a)
	{
		if (a > 0 && nums[a] == nums[a - 1])continue;
		for (int b = a + 1; b < size - 2; ++b)//以下代码与三数之和一样的
		{
			if (b > a + 1 && nums[b] == nums[b - 1])continue;
			int i = b + 1, j = size - 1;
			while (i < j)
			{
				int sum = nums[a] + nums[b] + nums[i] + nums[j];
				if (sum < target)
					while (i < j&&nums[i] == nums[++i]);
				else if (sum > target)
					while (i < j&&nums[j] == nums[--j]);
				else {
					result.push_back(vector<int>{nums[a], nums[b], nums[i], nums[j]});
					while (i < j&&nums[i] == nums[++i]);
					while (i < j&&nums[j] == nums[--j]);
				}
			}
		}
	}
	return result;
}